package com.sky.d_fork_jion;

import java.util.List;
import java.util.concurrent.RecursiveAction;

public class ProductTask extends RecursiveAction{

	//声明类的序列版本UID。这个元素是必需的，因为RecursiveAction类的父类ForkJoinTask实现了Serializable接口
	private static final long serialVersionUID = 1L;
	
	//声明一个私有的、List<Product>类型的属性products
	private List<Product> products;
	
	//声明两个私有的、int类型的属性first和last。这些属性将决定这个任务产品的阻塞过程
	private int first;
	private int last;
	
	//声明一个私有的、double类型的属性increment，用来存储产品价格的增长
	private double increment;
	
	//实现这个类的构造器，初始化所有属性
	public ProductTask(List<Product> products, int first, int last, double increment){
		this.products = products;
		this.first = first;
		this.last = last;
		this.increment = increment;
	}

	//实现compute()方法 ，该方法将实现任务的逻辑
	@Override
	protected void compute() {
		
		//如果last和first的差小于10，使用updatePrices()方法递增的设置产品的价格
		if ((last - first) < 10){
			updatePrices();
		} else {
			//如果last和first的差大于或等于10，则创建两个新的Task对象，一个处理产品的前半部分，
			//另一个处理产品的后半部分，然后在ForkJoinPool中，使用invokeAll()方法执行它们
			int middle = (last + first)/2;
			System.out.println("Task pending tasks:" + getQueuedTaskCount());
			
			ProductTask t1 = new ProductTask(products, first, middle + 1, increment);
			ProductTask t2 = new ProductTask(products, middle + 1, last, increment);
			invokeAll(t1, t2);
		}
		
	}

	//实现updatePrices()方法。这个方法更新产品队列中位于first值和last值之间的产品
	private void updatePrices() {
		for(int i = first; i<last; i ++){
			Product product = products.get(i);
			product.setPrice(product.getPrice() * (1 + increment));
		}
		
	}
	

}
